package dcore.id;

/**
 * @author djin
 * Snowflake算法，原算法理论:<br/>
 * long长度为64位，对64位长度进行拆分，<br/>
 * 1位符号位，永远为0；<br/>
 * 41位时间码，存储时间戳，这里的时间戳不是要从1970年开始算起，可以自己设定一个开始时间，计算时间戳差即可，41位时间戳可以用68年；<br/>
 * 10位机器码，可以部署2^10=1024个局点；<br/>
 * 12位序号码，记录一毫秒内产生的ID，顺序递增，1毫秒可以产生2^12=4096个ID。<br/>
 *
 * 以上为网上摘录的原算法，可以基于此进行一些变种。如原算法机器编码需要手动设定，我们可以想办法自动生成等等。<br/>
 *
 * 上述原算法时间码为时间戳，12位序号码，一台服务器每秒可产生4096*1000=409.6万IP，暂时没有这个条件达到这个水准；
 * 机器码可根据服务器的IP或者MAC地址自动生成，但是10位不够用；
 * 所以我们对算法稍微做了一点改动：
 * 1位符号位，永远为0；<br/>
 * 32位时间码，存储秒钟，可以自行设定一个开始时间，计算两者之间的秒数即可，可用136年；<br/>
 * 16为机器码，可部署2^16=65536个局点，且方便根据IP计算机器码，注意：此方式掩码必须为16，即IP只变后两位，前两位不便，否则可能会出现ID冲突问题；<br/>
 * 15位序号码，可生成2^15=32768个ID，1秒钟3万ID基本够用；<br/>
 */
public interface Snowflake {
    /**
     * 获取机器码
     *
     * @return
     */
    long getMachineCode();

    /**
     * 获取时间码
     *
     * @return
     */
    long getTimeCode();

    /**
     * 获取序号,如果返回0表示ID已用完
     *
     * @return
     */
    int getSequenceCode();

    /**
     * 获取下一个ID
     * @return
     */
    long nextId();
}
